{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-eb380d290e6b>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ../train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ../train-labels-idx1-ubyte.gz\n",
      "Extracting ../t10k-images-idx3-ubyte.gz\n",
      "Extracting ../t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"../\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义图\n",
    "\n",
    "# 占位符\n",
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")\n",
    "\n",
    "# 初始化函数\n",
    "def initialize(shape):\n",
    "    return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "# 神经网络\n",
    "def conv2d(x, W):\n",
    "    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')\n",
    "\n",
    "def max_pool_2_2(x):\n",
    "    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')\n",
    "\n",
    "# 第一层卷积\n",
    "# 定义参数\n",
    "W_conv1 = weight_variable([5, 5, 1, 32])\n",
    "b_conv1 = bias_variable([32])\n",
    "# 输入参数\n",
    "image = tf.reshape(x, [-1, 28, 28, 1])\n",
    "# 卷积激活\n",
    "h_conv1 = tf.nn.relu(conv2d(image, W_conv1) + b_conv1)\n",
    "# 池化\n",
    "h_pool1 = max_pool_2_2(h_conv1)\n",
    "\n",
    "# 第二层卷积\n",
    "W_conv2 = weight_variable([5, 5, 32, 64])\n",
    "b_conv2 = bias_variable([64])\n",
    "h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)\n",
    "h_pool2 = max_pool_2_2(h_conv2)\n",
    "\n",
    "# 密集连接层\n",
    "W_fc1 = weight_variable([7*7*64, 1024])\n",
    "b_fc1 = bias_variable([1024])\n",
    "h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])\n",
    "h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)\n",
    "\n",
    "# dropout层\n",
    "keep_prob = tf.placeholder('float')\n",
    "h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)\n",
    "\n",
    "# 输出层\n",
    "W_fc2 = weight_variable([1024, 10])\n",
    "b_fc2 = bias_variable([10])\n",
    "y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)\n",
    "\n",
    "# 定义损失函数\n",
    "cross_entropy_loss = -tf.reduce_sum(tf.cast(y, tf.float32)*tf.log(y_conv))\n",
    "\n",
    "# 优化器\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)\n",
    "\n",
    "# 输出值\n",
    "pred = tf.nn.softmax(logits)\n",
    "# y = tf.cast(y, tf.int64)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)  # tf.argmax 0按列，1按行，返回index\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n",
    "\n",
    "# batch, epoch\n",
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "ename": "InvalidArgumentError",
     "evalue": "You must feed a value for placeholder tensor 'Placeholder_41' with dtype float\n\t [[node Placeholder_41 (defined at <ipython-input-53-41f5bbaa1dbf>:43) ]]\n\nCaused by op 'Placeholder_41', defined at:\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py\", line 193, in _run_module_as_main\n    \"__main__\", mod_spec)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel_launcher.py\", line 16, in <module>\n    app.launch_new_instance()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/traitlets/config/application.py\", line 658, in launch_instance\n    app.start()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelapp.py\", line 505, in start\n    self.io_loop.start()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/platform/asyncio.py\", line 148, in start\n    self.asyncio_loop.run_forever()\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py\", line 421, in run_forever\n    self._run_once()\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py\", line 1426, in _run_once\n    handle._run()\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/events.py\", line 127, in _run\n    self._callback(*self._args)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/ioloop.py\", line 690, in <lambda>\n    lambda f: self._run_callback(functools.partial(callback, future))\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n    ret = callback()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 781, in inner\n    self.run()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 742, in run\n    yielded = self.gen.send(value)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelbase.py\", line 357, in process_one\n    yield gen.maybe_future(dispatch(*args))\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelbase.py\", line 267, in dispatch_shell\n    yield gen.maybe_future(handler(stream, idents, msg))\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelbase.py\", line 534, in execute_request\n    user_expressions, allow_stdin,\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/ipkernel.py\", line 294, in do_execute\n    res = shell.run_cell(code, store_history=store_history, silent=silent)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 2848, in run_cell\n    raw_cell, store_history, silent, shell_futures)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 2874, in _run_cell\n    return runner(coro)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/async_helpers.py\", line 67, in _pseudo_sync_runner\n    coro.send(None)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 3049, in run_cell_async\n    interactivity=interactivity, compiler=compiler, result=result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 3214, in run_ast_nodes\n    if (yield from self.run_code(code, result)):\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 3296, in run_code\n    exec(code_obj, self.user_global_ns, self.user_ns)\n  File \"<ipython-input-53-41f5bbaa1dbf>\", line 43, in <module>\n    keep_prob = tf.placeholder('float')\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py\", line 2077, in placeholder\n    return gen_array_ops.placeholder(dtype=dtype, shape=shape, name=name)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py\", line 5791, in placeholder\n    \"Placeholder\", dtype=dtype, shape=shape, name=name)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py\", line 788, in _apply_op_helper\n    op_def=op_def)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py\", line 507, in new_func\n    return func(*args, **kwargs)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 3300, in create_op\n    op_def=op_def)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 1801, in __init__\n    self._traceback = tf_stack.extract_stack()\n\nInvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder_41' with dtype float\n\t [[node Placeholder_41 (defined at <ipython-input-53-41f5bbaa1dbf>:43) ]]\n",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mInvalidArgumentError\u001b[0m                      Traceback (most recent call last)",
      "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m   1333\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1334\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1335\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m   1318\u001b[0m       return self._call_tf_sessionrun(\n\u001b[0;32m-> 1319\u001b[0;31m           options, feed_dict, fetch_list, target_list, run_metadata)\n\u001b[0m\u001b[1;32m   1320\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_call_tf_sessionrun\u001b[0;34m(self, options, feed_dict, fetch_list, target_list, run_metadata)\u001b[0m\n\u001b[1;32m   1406\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1407\u001b[0;31m         run_metadata)\n\u001b[0m\u001b[1;32m   1408\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mInvalidArgumentError\u001b[0m: You must feed a value for placeholder tensor 'Placeholder_41' with dtype float\n\t [[{{node Placeholder_41}}]]",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[0;31mInvalidArgumentError\u001b[0m                      Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-56-9665cf82373c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      8\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrainig_step\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      9\u001b[0m         \u001b[0mxs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m         \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msess\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcross_entropy_loss\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mxs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mys\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlearning_rate\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m0.3\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;36m100\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m    927\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    928\u001b[0m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 929\u001b[0;31m                          run_metadata_ptr)\n\u001b[0m\u001b[1;32m    930\u001b[0m       \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    931\u001b[0m         \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1150\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1151\u001b[0m       results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1152\u001b[0;31m                              feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m   1153\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1154\u001b[0m       \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1326\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1327\u001b[0m       return self._do_call(_run_fn, feeds, fetches, targets, options,\n\u001b[0;32m-> 1328\u001b[0;31m                            run_metadata)\n\u001b[0m\u001b[1;32m   1329\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1330\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m   1346\u001b[0m           \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1347\u001b[0m       \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0merror_interpolation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minterpolate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_graph\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1348\u001b[0;31m       \u001b[0;32mraise\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnode_def\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1349\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1350\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m_extend_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mInvalidArgumentError\u001b[0m: You must feed a value for placeholder tensor 'Placeholder_41' with dtype float\n\t [[node Placeholder_41 (defined at <ipython-input-53-41f5bbaa1dbf>:43) ]]\n\nCaused by op 'Placeholder_41', defined at:\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py\", line 193, in _run_module_as_main\n    \"__main__\", mod_spec)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel_launcher.py\", line 16, in <module>\n    app.launch_new_instance()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/traitlets/config/application.py\", line 658, in launch_instance\n    app.start()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelapp.py\", line 505, in start\n    self.io_loop.start()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/platform/asyncio.py\", line 148, in start\n    self.asyncio_loop.run_forever()\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py\", line 421, in run_forever\n    self._run_once()\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py\", line 1426, in _run_once\n    handle._run()\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/events.py\", line 127, in _run\n    self._callback(*self._args)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/ioloop.py\", line 690, in <lambda>\n    lambda f: self._run_callback(functools.partial(callback, future))\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n    ret = callback()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 781, in inner\n    self.run()\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 742, in run\n    yielded = self.gen.send(value)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelbase.py\", line 357, in process_one\n    yield gen.maybe_future(dispatch(*args))\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelbase.py\", line 267, in dispatch_shell\n    yield gen.maybe_future(handler(stream, idents, msg))\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/kernelbase.py\", line 534, in execute_request\n    user_expressions, allow_stdin,\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/tornado/gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/ipkernel.py\", line 294, in do_execute\n    res = shell.run_cell(code, store_history=store_history, silent=silent)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 2848, in run_cell\n    raw_cell, store_history, silent, shell_futures)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 2874, in _run_cell\n    return runner(coro)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/async_helpers.py\", line 67, in _pseudo_sync_runner\n    coro.send(None)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 3049, in run_cell_async\n    interactivity=interactivity, compiler=compiler, result=result)\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 3214, in run_ast_nodes\n    if (yield from self.run_code(code, result)):\n  File \"/Users/roy_zhou/Library/Python/3.6/lib/python/site-packages/IPython/core/interactiveshell.py\", line 3296, in run_code\n    exec(code_obj, self.user_global_ns, self.user_ns)\n  File \"<ipython-input-53-41f5bbaa1dbf>\", line 43, in <module>\n    keep_prob = tf.placeholder('float')\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py\", line 2077, in placeholder\n    return gen_array_ops.placeholder(dtype=dtype, shape=shape, name=name)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py\", line 5791, in placeholder\n    \"Placeholder\", dtype=dtype, shape=shape, name=name)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py\", line 788, in _apply_op_helper\n    op_def=op_def)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py\", line 507, in new_func\n    return func(*args, **kwargs)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 3300, in create_op\n    op_def=op_def)\n  File \"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 1801, in __init__\n    self._traceback = tf_stack.extract_stack()\n\nInvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder_41' with dtype float\n\t [[node Placeholder_41 (defined at <ipython-input-53-41f5bbaa1dbf>:43) ]]\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    # 定义验证集和测试集\n",
    "    validate_data = {x: mnist.validation.images, y: mnist.validation.labels}\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "    \n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run([optimizer, cross_entropy_loss], feed_dict={x: xs, y: ys, learning_rate: 0.3})\n",
    "        \n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9418\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images,\n",
    "                y: mnist.test.labels\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(16, 784)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist.test.images[:16].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
